// 打印html内容 (参数html: 需要打印的页面元素; 参数zoom: 页面缩放的比例可以使百分比或数字 但不能为负)
export default function printHtml(
    html: any,
    zoom?: any,
    overrideStyle?: string
  ) {
    const style = getStyle(zoom, overrideStyle);
    const container = getContainer(html);
    document.body.appendChild(style);
    document.body.appendChild(container);
  
    getLoadPromise(container).then(() => {
      window.print();
      document.body.removeChild(style);
      document.body.removeChild(container);
    });
  }
  
  // 设置打印样式
  function getStyle(zoom?: any, overrideStyle?: string) {
    const styleContent =
      `
    #print-container {
      display: none;
      zoom:${zoom ?? 'normal'};
    }
  
    @media print {
        body > :not(.print-container) {
            display: none;
        }
        html,
        body {
            display: block !important;
        }
        body {
          height:auto;
        }
        #print-container {
            display: block;
        }
  
    }` + overrideStyle;
    const style = document.createElement('style');
    style.innerHTML = styleContent;
    return style;
  }
  
  // 清空打印内容
  function cleanPrint() {
    const div = document.getElementById('print-container');
    if (!!div) {
      document.querySelector('body')?.removeChild(div);
    }
  }
  
  // 新建DOM，将需要打印的内容填充到DOM
  function getContainer(html: any) {
    cleanPrint();
    const container = document.createElement('div');
    container.setAttribute('id', 'print-container');
    container.innerHTML = html;
    return container;
  }
  
  // 图片完全加载后再调用打印方法
  function getLoadPromise(dom: any) {
    let imgs = dom.querySelectorAll('img');
    imgs = [].slice.call(imgs);
  
    if (imgs.length === 0) {
      return Promise.resolve();
    }
  
    let finishedCount = 0;
    return new Promise((resolve) => {
      function check() {
        finishedCount++;
        if (finishedCount === imgs.length) {
          resolve({});
        }
      }
      imgs.forEach((img: any) => {
        img.addEventListener('load', check);
        img.addEventListener('error', check);
      });
    });
  }
  